﻿Ext.History = new Ext.util.Observable({
    constructor: function () {
        Ext.History.superclass.constructor.call(this, config);

        this.addEvents(

            'change'//超链接锚点变化时触发
        );
    },


    init: function () {
        var me = this;

        //设置锚点
        //window.location对象包含有关当前 URL 的信息。
        //hash 属性是一个可读可写的字符串，该字符串是 URL 的锚部分（从 # 号开始的部分）。
        me.setToken(window.location.hash);

        if (Ext.supports.History) {
            window.addEventListener('hashchange', this.onChange);
        } else {
            setInterval(function () {
                var newToken = me.cleanToken(window.location.hash),//获取浏览器当前锚点'#'后部分
                    oldToken = me.getToken();//获取Ext.History当前锚点

                if (newToken != oldToken) {//如果Ext.History的锚点不是浏览器当前锚点
                    me.onChange();//触发锚点变化侦听函数
                }
            }, 50);//每隔50豪秒检查一次锚点的变化情况
        }
    },

    //锚点变化侦听函数
    onChange: function () {
        var me = Ext.History,
            newToken = me.cleanToken(window.location.hash);//浏览器当前锚点

        if (me.token != newToken) {//如果Ext.History的锚点不是浏览器当前锚点
            me.fireEvent('change', newToken);//触发'change'事件
        }

        me.setToken(newToken);
    },

    //设置锚点
    setToken: function (token) {
        //删除锚点字符串的'#'符号
        return this.token = this.cleanToken(token);
    },

    //删除锚点字符串token的'#'符号
    cleanToken: function (token) {
        //substr(start, length)方法可在字符串中抽取从 start 下标开始的指定数目的字符。
        return token[0] == '#' ? token.substr(1) : token;
    },

    //获取锚点
    getToken: function () {
        return this.token;
    },

    //添加新锚点
    add: function (token) {
        window.location.hash = this.setToken(token);

        if (!Ext.supports.History) {
            this.onChange();
        }
    }
});